package cn.edu.ldu.util;

import cn.edu.ldu.protocol.Protocol;
import cn.edu.ldu.views.modules.controller.UserController;
import cn.edu.ldu.views.modules.controller.ServerViewController;
import cn.edu.ldu.views.ServerView;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveMessage extends Thread {

    private DatagramSocket serverSocket;
    private DatagramPacket packet;
    private byte[] data = new byte[8096];
    private ServerView serverView;
    private Protocol ptl;

    public ReceiveMessage(ServerView serverView){
        serverSocket = UserController.getServerSocket();
        this.serverView = serverView;
        ServerViewController.setServerView(serverView);
    }
    @Override
    public void run(){
        while (true){

            packet = new DatagramPacket(data, data.length);
            try {
                serverSocket.receive(packet);

                L.OK(packet, ReceiveMessage.class, 0);

                ptl = (Protocol)Translate.ByteToObject(packet.getData());
                ptl.setPacket(packet);

            } catch (IOException e) {
                e.printStackTrace();
            }

//                if(msg.getType().equalsIgnoreCase(Consts.M_LOGIN)){
//                    userLogin();
//                }else if(msg.getType().equalsIgnoreCase(Consts.M_MSG)){
//                    sendMessage();
//                }else if(msg.getType().equalsIgnoreCase(Consts.M_LOGOUT)){
//                    userQuit();
//                }else if(msg.getType().equalsIgnoreCase(Consts.R_ADD_FRIENDS)){
//                    userGetFriend();
//                }else if(msg.getType().equalsIgnoreCase(Consts.R_CHAT_HISTORY)){
//                    getFriendChatHistory();
//                }

                try {
                    L.OK(ptl.getKey(), ReceiveMessage.class);
                    Class cls = Class.forName("cn.edu.ldu.protocol." + ptl.getKey());
                    Constructor con = cls.getConstructor(Protocol.class);
                    con.newInstance(ptl);

                } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
                    e.printStackTrace();
                }

        }
    }

//    private void userLogin() throws IOException {
//        //获取数据库信息,转换为实体对象
//        UserEntity userEntity = null;
//        Long userId = msg.getUserId();
//        try {
//            userEntity = userController.getUser(userId);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        if(userEntity == null || !(userId.equals(userEntity.getId())) || !Util.MD5(msg.getPassword()).equals(userEntity.getPassword())){
//            sendPacketBackToUser(Consts.M_FAILURE);
//        }else {
//            sendPacketBackToUser(Consts.M_SUCCESS);
//            UserEntity user = new UserEntity();
//            user.setId(userId);
//            user.setPort(packet.getPort());
//            user.setAddress(packet.getAddress());
//            userList.put(userId, user);
//
//            //获取好友在线列表
//            List<FriendsEntity> allFriends = new ArrayList<>();
//            List<FriendsEntity> onlineFriends = new ArrayList<>();
//            List<FriendsEntity> offlineFriends = new ArrayList<>();
//            try {
//                allFriends = new FriendsController().getFriendsByUserId(userId);
//                for(FriendsEntity fe : allFriends){
//                    if(userList.containsKey(fe.getFriendId())){
//                        onlineFriends.add(fe);
//                    }else {
//                        offlineFriends.add(fe);
//                    }
//                }
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//            HashMap<String, List<FriendsEntity>> friends = new HashMap<>();
//            friends.put("onlineFriends", onlineFriends);
//            friends.put("offlineFriends", offlineFriends);
//            //通知所有在线好友：“我上线了”
//            for(FriendsEntity fe : onlineFriends){
//                Message message = new Message();
//                message.setType(Consts.M_LOGIN);
//                message.setUserId(userId);
//                sendPacketToUser(userList.get(fe.getFriendId()), message);
//            }
//            byte[] data = Translate.ObjectToByte(friends);
//            DatagramPacket dp = new DatagramPacket(data, data.length, packet.getAddress(), packet.getPort());
//            serverSocket.send(dp);
//
//        }
//    }
//
//    private void sendMessage(Message msg) throws IOException{
////        UserEntity userEntity = Translate.ByteToObject(msg.getByte());
////      serverView.consoleJTA(userId + "说："+msg.getContent() + "\n");
//        ChatHistoryEntity chatHistoryEntity = new ChatHistoryEntity();
//        chatHistoryEntity.setSenderId(msg.getUserId());
//        chatHistoryEntity.setTalkerId(msg.getTargetId());
//        chatHistoryEntity.setContent(String.valueOf(msg.getText().get(Consts.CHAT_MSG)));
//        chatHistoryEntity.setMsg(1);
//        chatHistoryEntity.setSendTime(new Date());
//        try {
//            chatHistoryController.addChatHistory(chatHistoryEntity);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        DatagramSocket clientSocket = new DatagramSocket();
//
//        chatHistoryEntity.setUserId(chatHistoryEntity.getSenderId());
//        chatHistoryEntity.setTargetId(chatHistoryEntity.getTalkerId());
//        chatHistoryEntity.setType(Consts.M_MSG);
//
//
//        byte[] data = Translate.ObjectToByte(chatHistoryEntity);
//
//        DatagramPacket packet = new DatagramPacket(data, data.length, msg.getToAddr(), msg.getToPort());
//        clientSocket.send(packet);
//    }
//
//    private void userQuit() throws IOException {
//        serverView.consoleJTA(msg.getUserId() + "下线\n");
//        userList.remove(msg.getUserId());
//        //通知在线好友 ：“我下线了”
//        Message newMsg = new Message();
//        newMsg.setUserId(msg.getUserId());
//        newMsg.setType(Consts.M_LOGOUT);
//        for (Map.Entry<Long, UserEntity> entry : userList.entrySet()) {
//            System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
//            sendPacketToUser(entry.getValue(), newMsg);
//        }
//    }
//


}
